|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(******************************************************************************) (**) ОТДЕЛ ПроБПФ+; (****************************************************************************** * НАЗНАЧЕНИЕ: * сравнение вычисления быстрого преобразования Фурье (БПФ) и * вычисления обычного ПФ * ПРИМЕЧАНИЯ: * 1) во временной области формируем сигнал, состоящий из 200Гц синусоиды * и небольной по амплитуде 2000Гц косинусоиды; * 2) выполняем БПФ; * 3) удаляем частотные составляющие выше 1000Гц; * 4) выполняем обратное БПФ; * 5) сравниваем БПФ и ПФ. ******************************************************************************) ИСПОЛЬЗУЕТ Матем ИЗ "...\Отделы\Числа\", Компл ИЗ "...\Отделы\Числа\", КомплВект ИЗ "...\Отделы\Числа\", МатрВВ ИЗ "...\Отделы\Числа\", Вывод ИЗ "...\Отделы\Обмен\"; ПОСТ Отсчетов = 512; (* всего отсчетов сигнала (должно быть степенью 2) *) Дискретизация = 22050;(* частота дискретизации, Гц *) ВИД Вещ = Матем.Вещ; (******************************************************************************) ЗАДАЧА f(t:Вещ):Вещ; (* сигнал в определенный момент времени *) УКАЗ ВОЗВРАТ Матем.sin(200*Матем.ПИ2*t) + 0.2*Матем.cos(2000*Матем.ПИ2*t) КОН f; (******************************************************************************) ЗАДАЧА Голова; ПЕР i,частота:ЦЕЛ; t,dt:Вещ; вых:Компл.Вид; вход,выход:КомплВект.Доступ; УКАЗ СОЗДАТЬ(вход, Отсчетов); СОЗДАТЬ(выход,Отсчетов); t:=0; dt:=1/Дискретизация; ОТ i:=0 ДО Отсчетов-1 ВЫП Компл.алгВид(f(t),0,вход[i]); t:=t+dt КОН; Вывод.Цепь("^Временной ряд на входе БПФ^"); МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",вход^); КомплВект.БПФ(вход^,выход^); Вывод.Цепь("^Частотный ряд после БПФ^"); МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",выход^); (* убираем все частоты выше 1000 Гц *) частота:=УЗК(ВШИРЦЕЛ(1000*Отсчетов/Дискретизация)); ОТ i:=0 ДО Отсчетов-1 ВЫП ЕСЛИ ((i > частота) И (i < (Отсчетов ДЕЛИТЬ 2))) ИЛИ ((i >= (Отсчетов ДЕЛИТЬ 2)) И (i < Отсчетов-частота)) ТО выход[i]:=Компл.НОЛЬ КОН КОН; КомплВект.ОБПФ(выход^,вход^); Вывод.Цепь("^Временной ряд после фильтрации^"); МатрВВ.ВыводКомплВект("(%11.3e;%11.3e)^",вход^); Вывод.Цепь("^Сравнение БПФ и ПФ^"); (* заполняем <вход> случайным образом *) ОТ i:=0 ДО Отсчетов-1 ВЫП Компл.алгВид(Матем.случ()*10000, Матем.случ()*10000,вход[i]) КОН; (* вычисление через БПФ *) КомплВект.БПФ(вход^,выход^); ОТ i:=0 ДО Отсчетов-1 ВЫП (* вычисление через ПФ по определению *) КомплВект.ПФ(i,вход^,вых); (* сравнение результатов БПФ и ПФ *) Вывод.ЧВещ("%14.5f %14.5f %14.5f %14.5f^",выход[i].x, вых.x, выход[i].y, вых.y) КОН КОН Голова; (******************************************************************************) УКАЗ Голова КОН ПроБПФ. ▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|